package brainslug.jpa;
import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;
import org.h2.jdbcx.JdbcDataSource;
import org.postgresql.xa.PGXADataSource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.XADataSource;
@Configuration
public class TestDataSourceConfiguration {
enum Database {
MYSQL,
POSTGRES,
H2
}
@Bean
@Qualifier("brainslug")
public XADataSource xaDataSource() {
switch(getDb()) {
case MYSQL:
return createMySQLDatasource();
case POSTGRES:
return createPostgresDatasource();
default:
return createH2Datasource();
}
}
private XADataSource createMySQLDatasource() {
System.out.println("URL: " + getJdbcUrl());
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
MysqlXADataSource mysqlXADataSource = new MysqlXADataSource();
mysqlXADataSource.setURL(getJdbcUrl() + "?pinGlobalTxToPhysicalConnection=true");
mysqlXADataSource.setUser(getDbUser());
mysqlXADataSource.setPassword(getDbPassword());
return mysqlXADataSource;
}
private XADataSource createPostgresDatasource() {
PGXADataSource pgxaDataSource = new PGXADataSource();
pgxaDataSource.setUrl(getJdbcUrl());
pgxaDataSource.setUser(getDbUser());
pgxaDataSource.setPassword(getDbPassword());
return pgxaDataSource;
}
private XADataSource createH2Datasource() {
JdbcDataSource jdbcDataSource = new JdbcDataSource();
jdbcDataSource.setURL(getJdbcUrl());
jdbcDataSource.setUser(getDbUser());
jdbcDataSource.setPassword(getDbPassword());
return jdbcDataSource;
}
String getDbPassword() {
String passwordFromProperties = System.getProperty("db.password");
return passwordFromProperties == null ? "" : passwordFromProperties;
}
String getDbUser() {
String userFromProperties = System.getProperty("db.user");
return userFromProperties == null ? "sa" : userFromProperties;
}
String getJdbcUrl() {
String jdbcUrlFromProperties = System.getProperty("db.jdbc.url");
return jdbcUrlFromProperties == null ? "jdbc:h2:mem:testdb" : jdbcUrlFromProperties;
}
Database getDb() {
String db = System.getProperty("db");
return Database.valueOf(db == null ? "H2" : db.toUpperCase());
}
}